﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AutomatasPrj
{
    class AFD
    {
        private Estado inicial;
        private Estado[] finales;
        private DeltaAFD delta;

        public AFD(Estado inicial,
                    DeltaAFD delta,
                    Estado[] finales)
        {
            this.inicial = inicial;
            this.delta = delta;
            this.finales = finales;
        }

        public bool Accepts(String palabra)
        {
            return finales.Contains(deltaGorro(inicial, palabra));
        }

        public Estado deltaGorro(Estado estado, String palabra)
        {
            foreach (Char simbolo in palabra)
            {
                estado = delta.Evaluate(estado, simbolo);
            }

            return estado;
        }

        //public Estado[] Estados
        //{
        //    get { return delta.Keys; }
        //}

        //public AFD Minimize()
        //{
        //    Dictionary<Estado, Dictionary<Estado, bool>> distinguishables = new Dictionary<Estado,Dictionary<Estado,bool>>();

        //    // Inicializacion de la matriz
        //    foreach (Estado estadoX in Estados)
        //    {
        //        foreach (Estado estadoY in Estados)
        //        {
        //            distinguishables[estadoX][estadoY] = false;

        //            // Los pares (final,nofinal) son distinguibles.
        //            if (finales.Contains(estadoX) && !finales.Contains(estadoY))
        //            {
        //                distinguishables[estadoX][estadoY] = true;
        //            }

        //            // Los pares (nofinal,final) son distinguibles.
        //            if (finales.Contains(estadoY) && !finales.Contains(estadoX))
        //            {
        //                distinguishables[estadoY][estadoX] = true;
        //            }
        //        }
        //    }

        //    // Analisis de vecinos
        //    foreach (Estado estadoX in Estados)
        //    {
        //        foreach (Estado estadoY in Estados)
        //        {
        //            foreach (Char simbolo in alfabeto)
        //            {
        //                Estado vecinoX = delta[estadoX][simbolo];
        //                Estado vecinoY = delta[estadoY][simbolo];

        //                // Si par de vecinos son distinguibles, este par también (a,b)--simbolo-->(c,d)
        //                if (distinguishables[vecinoX][vecinoY] == true)
        //                    distinguishables[estadoX][estadoY] = true;
        //            }
        //        }
        //    }
        //}

        //public bool GeneratesEmptyLanguage()
        //{
        //}

        //public bool GeneratesContainedLanguage(AFD A2) //L(this) contenido en L(A2)
        //{
        //}

        //public bool Equals(AFD A2)
        //{
        //    return (this.GeneratesContainedLanguage(A2) && A2.GeneratesContainedLanguage(this));
        //}
    }
}
